package com.chenfan.mcn.model.common;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

/**
 * 兼容之前老的分页
 * @author wulg
 * @date 2021-09-06
 **/
@Data
public class PageInfo<T> implements Serializable {

    private static final long serialVersionUID = -5935515090204718530L;

    /**
     * 当前页
     */
    private int pageNum;
    /**
     * 每页的数量
     */
    private int pageSize;
    /**
     * 当前页的数量
     */
    private int size;

    /**
     * 总记录数
     */
    private long total;
    /**
     * 总页数
     */
    private int pages;
    /**
     * 结果集
     */
    private List<T> list;

    /**
     * 前一页
     */
    private int prePage;
    /**
     * 下一页
     */
    private int nextPage;

    /**
     * 是否为第一页
     */
    private boolean isFirstPage = false;
    /**
     * 是否为最后一页
     */
    private boolean isLastPage = false;
    /**
     * 是否有前一页
     */
    private boolean hasPreviousPage = false;
    /**
     * 是否有下一页
     */
    private boolean hasNextPage = false;
    /**
     * 导航页码数
     */
    private int navigatePages;
    /**
     * 所有导航页号
     */
    private int[] navigatepageNums;
    /**
     * 导航条上的第一页
     */
    private int navigateFirstPage;
    /**
     * 导航条上的最后一页
     */
    private int navigateLastPage;

    public static <T> PageInfo<T> toPageInfo(Page<T> page) {
        PageInfo<T> pageInfo = new PageInfo();
        pageInfo.setList(page.getRecords());
        pageInfo.setTotal(page.getTotal());
        pageInfo.setPageNum(Long.valueOf(page.getPages()).intValue());
        pageInfo.setPageSize(Long.valueOf(page.getSize()).intValue());
        return pageInfo;
    }

    public static <S,T> PageInfo<S> toPageInfo(Page<T> page, Class<S> clazz) {
        PageInfo<S> pageInfo = new PageInfo();
        if(CollectionUtils.isNotEmpty(page.getRecords())) {
            List<S> list = listToCustomList(page.getRecords(), clazz, null);
            pageInfo.setList(list);
        }else{
            pageInfo.setList(new ArrayList<>());
        }

        pageInfo.setTotal(page.getTotal());
        pageInfo.setPageNum(Long.valueOf(page.getPages()).intValue());
        pageInfo.setPageSize(Long.valueOf(page.getSize()).intValue());
        return pageInfo;
    }

    private static <T, R> List<T> listToCustomList(List<R> oldItems, Class<T> clazz, BiConsumer biConsumer) {
        List<T> ts = oldItems.stream().map(item -> {
            T t = null;
            try {
                t = clazz.newInstance();
            } catch (Exception e) {
                //
            }
            BeanUtils.copyProperties(item, t);
            if (Objects.nonNull(biConsumer)) {
                biConsumer.accept(item, t);
            }

            return t;
        }).collect(Collectors.toList());
        return ts;
    }
}